#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/msg.h>

typedef struct msgbuf
{
    long msgtype;
    char msgtext[32];
} MSG;

void sig_ignore(int sig) {
    ;
}

int main(int argc, const char *argv[]) 
{
    signal(SIGUSR1, sig_ignore);

    key_t key;
    key = ftok("/", 'b');
    int msqid, flag;
    flag = 0;


    msqid = msgget(key, IPC_CREAT | IPC_EXCL | 0664);
    if(msqid == -1) {
        if(errno == EEXIST) {
            printf("消息队列已存在\n");
            msqid = msgget(key, 0664);
            flag = 1;
        } else {
            perror("msgget");
            return -1;
        }
    } else {
        printf("消息队列创建成功\n");
    }

    ssize_t n;
    char *in;
    MSG mymsg;
    while(1) {
        mymsg.msgtype = 100;
        if(flag == 0) {
            scanf("%s", mymsg.msgtext);
            msgsnd(msqid, &mymsg, strlen(mymsg.msgtext)+1, 0);
        } else {
            n = msgrcv(msqid, &mymsg, sizeof(MSG)-sizeof(long), 100, 0);
            printf("n = %d, buff:%s\n", n, mymsg.msgtext);
        }
        if(strncmp(mymsg.msgtext, "quit", 4) == 0) {
            msgctl(msqid, IPC_RMID, NULL);
            return 0;
        }
    }

    return 0;
}

